package com.dayuanit.dy15.atm.controller;

import com.dayuanit.dy15.atm.dto.ResponseDTO;
import com.dayuanit.dy15.atm.entity.User;
import com.dayuanit.dy15.atm.entity.WxUserInfo;
import com.dayuanit.dy15.atm.service.UserService;
import com.dayuanit.dy15.atm.service.WxBindService;
import com.dayuanit.dy15.atm.wx.AccessTokenDTO;
import com.dayuanit.dy15.atm.wx.WxHandler;
import com.dayuanit.dy15.atm.wx.WxUserInfoDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpSession;

@Controller
public class WxController extends BaseController {

    @Autowired
    private UserService userService;

    @Autowired
    private WxBindService wxBindService;

    @Autowired
    private WxHandler wxHandler;

    /**
     * 第一步 获取code
     * @return
     */
    @RequestMapping("/wx/getCodeUrl")
    @ResponseBody
    public ResponseDTO getCodeUrl() {
        return ResponseDTO.sucess(wxHandler.createCodeUrl());
    }

    /**
     * 第二步 通过code获取access_token
     *
     */
    @RequestMapping("/wx/callback")
    public String callback(String code, HttpSession session) {
        logger.info("code={}", code);

        //将第二步的返回结果 反序列化为对象
        AccessTokenDTO accessTokenDTO = wxHandler.getAccessToken(code);

        //通过微信openId查询绑定信息  对绑定表open_id加唯一索引，能解决重复绑定的问题，还能解决sql查询慢的问题，sql索引优化。
        //关于哪个字段加索引，这就要看业务了，哪个字段有相关的查询，那么就给哪个字段加索引。
        WxUserInfo wxUserInfo = wxBindService.getWxUserInfo(accessTokenDTO.getOpenid());
        if (null != wxUserInfo) {
            //若已绑定，则从绑定信息中获取atm系统的userId，通过userId获取用户信息，保存到session中，即可完成登录过程。
            User user = userService.getUser(wxUserInfo.getUserId());
            savaUserStatus(user, session);
            //使用重定向解决 重复提交的问题，如果使用服务器内部跳转，则会出现刷新页面code重复消费的问题，
            //无法达到接口的幂等性。
            return "redirect:/user/toHome";
//            return "index";
        }

        //第三步 获取用户的微信信息
        WxUserInfoDTO wxUserInfoDTO = wxHandler.getWxUserInfo(accessTokenDTO.getAccessToken(), accessTokenDTO.getOpenid());
        session.setAttribute("wxUserInfoDTO", wxUserInfoDTO);
        return "redirect:/wx/toBind";
    }

    @RequestMapping("/wx/wxBind")
    @ResponseBody
    public ResponseDTO wxBind(String username, String password, HttpSession session) {
        //校验用户名和账号 通过则将openID和用户ID保存到数据库中

        //其实atm登录过程
        User user = userService.login(username, password);
        //将用户信息保存到session中，然后页面重定向到用户中心，完成了第三方登录。
        savaUserStatus(user, session);

        WxUserInfoDTO wxUserInfoDTO = (WxUserInfoDTO)session.getAttribute("wxUserInfoDTO");
        String openid = wxUserInfoDTO.getOpenid();

        //添加绑定关系
        wxBindService.bindUser(wxUserInfoDTO, user);
        return ResponseDTO.sucess();
    }

}
